#pragma once

#include <QtWidgets/QWidget>
#include "ui_ExMainHUD.h"

#include "ExGameTimer.h"
#include "ExRenderThread.h"
#include "ExCommon.h"


class ExMainHUD : public QWidget
{
	Q_OBJECT

public Q_SLOTS:

	void UpdateRender();

public:

	ExMainHUD(QWidget* parent = Q_NULLPTR);

	virtual void OnResize();                  // 该父类方法需要在窗口大小变动的时候调用
	virtual void UpdateScene(float dt);       // 子类需要实现该方法，完成每一帧的更新
	virtual void DrawScene();                // 子类需要实现该方法，完成每一帧的绘制

	bool ExNativeEvent(const QByteArray& eventType, void* message, long* result);

private:

	bool InitDirect2D();        // Direct2D初始化

	bool InitDirect3D();        // Direct3D初始化

	void CalculateFrameStats(); // 计算每秒帧数并在窗口显示


	//重写虚函数
	virtual void resizeEvent(QResizeEvent* event) override; //当窗口尺寸改变时响应

	virtual void closeEvent(QCloseEvent* event) override;

	QPaintEngine* paintEngine() const { return 0; }	// 允许dx渲染, 不重写这个会闪烁

	float AspectRatio()const;   // 获取屏幕宽高比

	virtual void mousePressEvent(QMouseEvent* event) override;

	virtual void mouseReleaseEvent(QMouseEvent* event) override;

	virtual void wheelEvent(QWheelEvent* event) override;

	virtual void keyPressEvent(QKeyEvent* event) override;

	virtual void keyReleaseEvent(QKeyEvent* event) override;

	bool isKeyDown(Qt::Key key);

private:

	Ui::ExMainHUDClass ui;

	ExRenderThread* RenderThread;

	ExGameTimer m_Timer;           // 计时器

	// 使用模板别名(C++11)简化类型名
	template <class T>
	using ComPtr = Microsoft::WRL::ComPtr<T>;

	// D3D 设备
	ComPtr<ID3D11Device> m_pD3DDevice;
	// D3D 设备上下文
	ComPtr<ID3D11DeviceContext> m_pD3DDeviceContext;

	// D2D 工厂
	ComPtr<ID2D1Factory1> m_pD2DFactory;
	// D2D 设备
	ComPtr<ID2D1Device> m_pD2DDevice;
	// D2D 设备上下文
	ComPtr<ID2D1DeviceContext> m_pD2DDeviceContext;

	// WIC 工厂
	ComPtr<IWICImagingFactory2> m_pWICFactory;
	// DWrite工厂
	ComPtr<IDWriteFactory1> m_pDWriteFactory;
	// DXGI 交换链
	ComPtr<IDXGISwapChain1> m_pSwapChain;
	// D2D 位图 储存当前显示的位图
	ComPtr<ID2D1Bitmap1> m_pD2DTargetBimtap;
	// 单色画刷
	ComPtr<ID2D1SolidColorBrush> m_pBrush;
	// 字体格式
	ComPtr<IDWriteTextFormat> m_pTextFormat;
	// D2D位图
	ComPtr<ID2D1Bitmap1> m_pBitmap;
	// 测试特效
	ComPtr<ID2D1Effect> m_pEffectTest;
	//  所创设备特性等级
	D3D_FEATURE_LEVEL m_featureLevel;
	// 手动交换链
	DXGI_PRESENT_PARAMETERS m_parameters;
	// 浮点数据
	float m_afData;

	// 派生类应该在构造函数设置好这些自定义的初始参数
	int m_ClientWidth;                                   // 视口宽度
	int m_ClientHeight;                                  // 视口高度

	std::list<int> keyStates;
};
